home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / m2 / cat3src / magic / i / mtlists.i < prev    next >
Encoding:
Modula Implementation  |  1997-10-26  |  7.2 KB  |  241 lines

  1. (*----------------------------------------------------------------------*
  2.  *                                                                      *
  3.  *  MAGICTOOLS   Modula's  All purpose  GEM  Interface  Cadre  Toolbox  *
  4.  *               ÿ         ÿ            ÿ    ÿ          ÿ               *
  5.  *----------------------------------------------------------------------*
  6.  * Version 3.30  02.02.1992     (C)90/91/92 by Peter Hellinger Software *
  7.  *----------------------------------------------------------------------*
  8.  *            Dieses Modul ist urheberrechtlich geschtzt.              *
  9.  *                                                                      *
  10.  * Die Ver”ffentlichung des Quelltextes oder Teilen daraus, sowie die   *
  11.  * Verbreitung des bersetzten, nicht gelinkten Codes in schriftlicher, *
  12.  * oder maschinenlesbarer Form, insbesondere in Zeitschriften, Mail-    *
  13.  * boxen oder anderen Medien bedarf der ausdrcklichen schriftlichen    *
  14.  * Einverst„ndnisserkl„rung des Autors.                                 *
  15.  *                                                                      *
  16.  * Die Verbreitung des Moduls als Teil eines gelinkten Programms ist    *
  17.  * fr Lizenznehmer ausdrcklich erlaubt!  Der Autor beh„lt sich das    *
  18.  * Recht vor, diese Erlaubnis jederzeit und ohne Angaben von Grnden zu *
  19.  * widerrufen.                                                          *
  20.  *----------------------------------------------------------------------*)
  21.  
  22. IMPLEMENTATION MODULE mtLists;
  23.  
  24. (*----------------------------------------------------------------------*
  25.  * Int. Vers | Datum    | Name | Žnderung                               *
  26.  *-----------+----------+------+----------------------------------------*
  27.  *  3.00     | 18.01.92 |  Hp  |                                        *
  28.  *-----------+----------+------+----------------------------------------*)
  29.  
  30.  
  31.  
  32. (* IMPLEMENTATION FšR  >>> Megamax-Modula-2 <<< *)
  33. (*                                              *)
  34. (*$R-   Range-Checks                            *)
  35. (*$S-   Stack-Check                             *)
  36. (*                                              *)
  37. (*----------------------------------------------*)
  38.  
  39.  
  40.  
  41.  
  42.  
  43.  
  44. FROM MagicSys   IMPORT  Nil, Null, Bit0, Bit1, Bit2, Bit3, Bit4, Bit5, Bit6,
  45.                         Bit7, Bit8, Bit9, Bit10, Bit11, Bit12, Bit13, Bit14,
  46.                         Bit15, LOC, Byte, ByteSet, sWORD, sINTEGER, sCARDINAL,
  47.                         sBITSET, lINTEGER, lCARDINAL, lWORD, lBITSET,
  48.                         CastToChar, CastToByte, CastToByteset, CastToInt,
  49.                         CastToCard, CastToBitset, CastToWord, CastToLInt,
  50.                         CastToLCard, CastToLBitset, CastToLWord, CastToAddr,
  51.                         TosVersion, Accessory, Basepage, SysHeader, TosDate;
  52.  
  53.  
  54.  
  55.  
  56.  
  57.  
  58.  
  59.  
  60. FROM Storage IMPORT ALLOCATE, DEALLOCATE;
  61.  
  62.  
  63.  
  64.  
  65. FROM SYSTEM IMPORT  ADDRESS, ADR, TSIZE;
  66.  
  67. CONST   cMax =          07FFFH;
  68.  
  69. TYPE    INFO =          POINTER TO ARRAY [0..cMax] OF LOC;
  70.  
  71. TYPE    ENTRY =         POINTER TO Entry;
  72.         Entry =         RECORD
  73.                          addr: INFO;
  74.                          size: CARDINAL;
  75.                          next: ENTRY;
  76.                          last: ENTRY;
  77.                         END;
  78.  
  79. TYPE    LIST =          POINTER TO List;
  80.         List =          RECORD
  81.                          start: ENTRY;
  82.                          end:   ENTRY;
  83.                          comp:  CompProc;
  84.                          entry: lCARDINAL;
  85.                         END;
  86.  
  87.  
  88. PROCEDURE Copy (from, to: INFO; size: CARDINAL);
  89. VAR c: CARDINAL;
  90. BEGIN
  91.  FOR c:= 0 TO size DO to^[c]:= from^[c]; END;
  92. END Copy;
  93.  
  94. PROCEDURE NewList (VAR list: LIST; comp: CompProc): BOOLEAN;
  95. BEGIN
  96.  ALLOCATE (list,  TSIZE (List));  
  97.  IF list = NIL THEN RETURN FALSE; END;
  98.  list^.start:= NIL;
  99.  list^.comp:= comp;
  100.  RETURN TRUE;
  101. END NewList;
  102.  
  103. PROCEDURE DisposeList (VAR list: LIST);
  104. VAR p: ENTRY;
  105. BEGIN
  106.  IF list # NIL THEN
  107.   WITH list^ DO
  108.    WHILE start # NIL DO
  109.     p:= start^.next;
  110.     DEALLOCATE (start^.addr, 0);  
  111.     DEALLOCATE (start, 0);  
  112.     start:= p;
  113.    END;
  114.   END;
  115.   DEALLOCATE (list, 0);  
  116.  END;
  117. END DisposeList;
  118.  
  119. PROCEDURE NilEntry (): ENTRY;
  120. BEGIN
  121.  RETURN NIL;
  122. END NilEntry;
  123.  
  124. PROCEDURE InsertEntry (list: LIST; info: ARRAY OF LOC): BOOLEAN;
  125. VAR s, t: ENTRY;
  126.     f:    BOOLEAN;
  127. BEGIN
  128.  IF list = NIL THEN  RETURN FALSE;  END;
  129.  ALLOCATE (t,  TSIZE(Entry));  ;
  130.  IF t = NIL THEN  RETURN FALSE;  END;
  131.  t^.size:= HIGH (info);  t^.last:= NIL;  t^.next:= NIL;
  132.  ALLOCATE (t^.addr,  LONG (t^.size));  ;
  133.  IF t^.addr = NIL THEN  DEALLOCATE (t, 0);    RETURN FALSE;  END;
  134.  Copy (ADR(info), t^.addr, t^.size);
  135.  WITH list^ DO
  136.   s:= start;
  137.   IF s = NIL THEN
  138.    start:= t;  end:= t;
  139.   ELSE
  140.    f:= FALSE;
  141.    WHILE (s # NIL) AND NOT f DO
  142.     IF comp (s^.addr, ADR(info)) = smaller THEN  s:= s^.next;
  143.                                            ELSE  f:= TRUE;
  144.     END;
  145.    END;
  146.    t^.next:= s;
  147.    IF s = start THEN
  148.     start:= t;  s^.last:= t
  149.    ELSIF s = NIL THEN
  150.     t^.last:= end;  end^.next:= t;  end:= t;
  151.    ELSE
  152.     t^.last:= s^.last;  s^.last^.next:= t;  s^.last:= t;
  153.    END;
  154.   END;
  155.   INC (entry);
  156.  END;
  157.  RETURN TRUE;
  158. END InsertEntry;
  159.  
  160. PROCEDURE ListEntries (list: LIST): lCARDINAL;
  161. BEGIN
  162.  IF list = NIL THEN RETURN LONG (0);
  163.                ELSE RETURN list^.entry;
  164.  END;
  165. END ListEntries; 
  166.  
  167. PROCEDURE SearchEntry (list: LIST; from: ENTRY;
  168.                        info: ARRAY OF LOC;  key: CompProc): ENTRY;
  169. VAR s: ENTRY;
  170.     b1, b2: BOOLEAN;
  171. BEGIN
  172.  IF list = NIL THEN  RETURN NIL;  END;
  173.  WITH list^ DO
  174.   s:= start;
  175.   WHILE s # NIL DO
  176.    IF key (s^.addr, ADR (info)) = equal THEN  RETURN s;  END;
  177.    s:= s^.next;
  178.   END;
  179.  END;
  180.  RETURN NIL;
  181. END SearchEntry;
  182.  
  183. PROCEDURE DeleteEntry (list: LIST; VAR entr: ENTRY);
  184. VAR t: ENTRY;
  185. BEGIN
  186.  IF (list = NIL) OR (entr = NIL) THEN  RETURN;  END;
  187.  WITH list^ DO
  188.   IF entr = start THEN
  189.    t:= start;  start:= start^.next;  start^.last:= NIL;
  190.    IF start = NIL THEN  end:= NIL;  END;
  191.    DEALLOCATE (t^.addr, 0);    DEALLOCATE (t, 0);  
  192.    DEC (entry);
  193.   ELSIF entr = end THEN
  194.    t:= end;  end:= end^.last;  end^.next:= NIL;
  195.    DEALLOCATE (t^.addr, 0);    DEALLOCATE (t, 0);  
  196.    DEC (entry);
  197.   ELSE
  198.    entr^.next^.last:= entr^.last;
  199.    entr^.last^.next:= entr^.next;
  200.    DEALLOCATE (entr^.addr, 0);  ;  DEALLOCATE (entr, 0);  ;
  201.    DEC (entry);
  202.   END;
  203.  END;
  204.  entr:= NIL;
  205. END DeleteEntry;
  206.  
  207. PROCEDURE FirstEntry (list: LIST): ENTRY;
  208. BEGIN
  209.  IF list = NIL THEN  RETURN NIL;  END;
  210.  RETURN list^.start;
  211. END FirstEntry;
  212.  
  213. PROCEDURE LastEntry (list: LIST): ENTRY;
  214. BEGIN
  215.  IF list = NIL THEN  RETURN NIL;  END;
  216.  RETURN list^.end;
  217. END LastEntry;
  218.  
  219. PROCEDURE NextEntry (entry: ENTRY): ENTRY;
  220. BEGIN
  221.  IF entry = NIL THEN  RETURN NIL;  END;
  222.  RETURN entry^.next;
  223. END NextEntry;
  224.  
  225. PROCEDURE PrevEntry (entry: ENTRY): ENTRY;
  226. BEGIN
  227.  IF entry = NIL THEN  RETURN NIL;  END;
  228.  RETURN entry^.last;
  229. END PrevEntry;
  230.  
  231. PROCEDURE GetEntry (entry: ENTRY; VAR info: ARRAY OF LOC): BOOLEAN;
  232. BEGIN
  233.  IF entry = NIL THEN  RETURN FALSE;  END;
  234.  IF HIGH (info) < entry^.size THEN  RETURN FALSE;  END;
  235.  Copy (entry^.addr, ADR(info), entry^.size);
  236.  RETURN TRUE;
  237. END GetEntry;
  238.  
  239. END mtLists.
  240.  
  241.